{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T17:56:43.672411Z",
     "start_time": "2020-08-03T17:56:43.670023Z"
    }
   },
   "outputs": [],
   "source": [
    "import modin.pandas as pd\n",
    "import numpy as np\n",
    "import swifter\n",
    "\n",
    "import perfplot\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:11:07.639672Z",
     "start_time": "2020-08-03T18:11:07.467094Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "UserWarning: Distributing <class 'dict'> object. This may take some time.\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame({\n",
    "    \"gaussian\": np.random.normal(size=1_000_000),\n",
    "    \"str_date\": [\"2020-01-01\"] * 1_000_000,\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:11:30.129466Z",
     "start_time": "2020-08-03T18:11:30.126464Z"
    }
   },
   "outputs": [],
   "source": [
    "def modin_apply(df, func):\n",
    "    return df.apply(func)._to_pandas()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:11:30.286133Z",
     "start_time": "2020-08-03T18:11:30.282799Z"
    }
   },
   "outputs": [],
   "source": [
    "def swifter_apply(df, func):\n",
    "    return df.swifter.apply(func)._to_pandas()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:28:54.307020Z",
     "start_time": "2020-08-03T18:28:54.302023Z"
    }
   },
   "outputs": [],
   "source": [
    "def perfplot_benchmark(df, field, func):\n",
    "    benchmark = perfplot.bench(\n",
    "        setup=lambda n: df.iloc[:n][field],\n",
    "        kernels=[\n",
    "            lambda srs: modin_apply(srs, func),\n",
    "            lambda srs: swifter_apply(srs, func),\n",
    "        ],\n",
    "        labels=[\"Modin Apply\", \"Swifter Apply\"],\n",
    "        n_range=[2**k for k in range (0, 26, 2)],\n",
    "        xlabel=\"n_rows\",\n",
    "        equality_check=lambda left, right: left.equals(right)\n",
    "    )\n",
    "    return benchmark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:44:04.214823Z",
     "start_time": "2020-08-03T18:28:56.329639Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/13 [00:00<?, ?it/s]\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:00<00:00,  1.17it/s]\u001b[A\n",
      "100%|██████████| 2/2 [00:01<00:00,  1.07it/s]\u001b[A\n",
      "  8%|▊         | 1/13 [00:02<00:24,  2.00s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:00<00:00,  1.07it/s]\u001b[A\n",
      "100%|██████████| 2/2 [00:02<00:00,  1.01it/s]\u001b[A\n",
      " 15%|█▌        | 2/13 [00:04<00:22,  2.02s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:01<00:01,  1.01s/it]\u001b[A\n",
      "100%|██████████| 2/2 [00:02<00:00,  1.05s/it]\u001b[A\n",
      " 23%|██▎       | 3/13 [00:06<00:20,  2.07s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:01<00:01,  1.03s/it]\u001b[A\n",
      "100%|██████████| 2/2 [00:02<00:00,  1.05s/it]\u001b[A\n",
      " 31%|███       | 4/13 [00:08<00:18,  2.10s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:01<00:01,  1.11s/it]\u001b[A\n",
      "100%|██████████| 2/2 [00:02<00:00,  1.10s/it]\u001b[A\n",
      " 38%|███▊      | 5/13 [00:10<00:17,  2.15s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:01<00:01,  1.33s/it]\u001b[A\n",
      "100%|██████████| 2/2 [00:02<00:00,  1.24s/it]\u001b[A\n",
      " 46%|████▌     | 6/13 [00:13<00:15,  2.27s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:02<00:02,  2.14s/it]\u001b[A\n",
      "100%|██████████| 2/2 [00:03<00:00,  1.83s/it]\u001b[A\n",
      " 54%|█████▍    | 7/13 [00:17<00:16,  2.78s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:08<00:08,  8.62s/it]\u001b[A\n",
      "100%|██████████| 2/2 [00:09<00:00,  6.35s/it]\u001b[A\n",
      " 62%|██████▏   | 8/13 [00:30<00:28,  5.80s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [00:21<00:21, 21.84s/it]\u001b[A\n",
      "100%|██████████| 2/2 [00:22<00:00, 15.62s/it]\u001b[A\n",
      " 69%|██████▉   | 9/13 [01:00<00:52, 13.12s/it][A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A\n",
      " 50%|█████     | 1/2 [01:00<01:00, 60.22s/it]\u001b[A\n",
      "100%|██████████| 2/2 [01:01<00:00, 42.54s/it]\u001b[A\n",
      " 77%|███████▋  | 10/13 [02:12<01:32, 30.93s/it]A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[2m\u001b[36m(pid=87398)\u001b[0m UserWarning: The pandas version installed 1.0.1 does not match the supported pandas version in Modin 1.0.5. This may cause undesired side effects!\n",
      "\u001b[2m\u001b[36m(pid=87399)\u001b[0m UserWarning: The pandas version installed 1.0.1 does not match the supported pandas version in Modin 1.0.5. This may cause undesired side effects!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      " 50%|█████     | 1/2 [03:23<03:23, 203.87s/it]\u001b[A\n",
      "100%|██████████| 2/2 [03:25<00:00, 143.18s/it]\u001b[A\n",
      " 85%|████████▍ | 11/13 [06:50<03:30, 105.06s/it]A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[2m\u001b[36m(pid=87396)\u001b[0m UserWarning: The pandas version installed 1.0.1 does not match the supported pandas version in Modin 1.0.5. This may cause undesired side effects!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      " 50%|█████     | 1/2 [02:58<02:58, 178.76s/it]\u001b[A\n",
      "100%|██████████| 2/2 [03:00<00:00, 125.64s/it]\u001b[A\n",
      " 92%|█████████▏| 12/13 [10:56<02:27, 147.26s/it]A\n",
      "  0%|          | 0/2 [00:00<?, ?it/s]\u001b[A"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[2m\u001b[36m(pid=87397)\u001b[0m UserWarning: The pandas version installed 1.0.1 does not match the supported pandas version in Modin 1.0.5. This may cause undesired side effects!\n",
      "\u001b[2m\u001b[36m(pid=94545)\u001b[0m UserWarning: The pandas version installed 1.0.1 does not match the supported pandas version in Modin 1.0.5. This may cause undesired side effects!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      " 50%|█████     | 1/2 [03:00<03:00, 180.49s/it]\u001b[A\n",
      "100%|██████████| 2/2 [03:01<00:00, 90.98s/it] \u001b[A\n",
      "100%|██████████| 13/13 [15:07<00:00, 69.84s/it] \n"
     ]
    }
   ],
   "source": [
    "bench = perfplot_benchmark(df, \"str_date\", pd.to_datetime)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:44:52.356921Z",
     "start_time": "2020-08-03T18:44:52.148634Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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BU4CnnLHLwLOiSbwvvhijwdV7CU/xhjTA9EwehMUkcogo1VVT+pluUyc14xOwOmo707gTVWd4E4fDSxV1cODLHsVcBVAeXn5lCVLlvQaZzCNjY0dnWr5fbzbx+/ebuamY/I4ZGjyHjLpSbCY00E6xm0xR6akpIQJEyZEtWw4fSuF48477+TJJ58kMzOTjIwM7rnnHo455phel7vtttuYPn06s2fPZtWqVVx//fVkZ2fz8MMP8/7773PBBRf0Oeb333+fGTNm8PTTT3c8LR2N3/zmNxQWFvKTn/wk7GU2btzInj17gH2/kdmzZ69R1f05FfkAABceSURBVKlRBRFtG9hIPjgtnSqBGcDGgPGjgQ97Wz7Wzzk8vnqrjrnpBf18196oy42ndGx7r5qecVvMkUn2cw6rVq3S448/Xpubm1VVdefOnVpTUxNxOVdffbU+/PDDqurszzPPPDPofD3F7PV6g46/8cYb9YQTTtC5c+dGHFOgX/3qV3rnnXdGtEysn3MIWa0kIpe4f28I9okgAdXhPEB3PFAqIv57HaOA7RFlsxiorvOQIbB/SfenE40xqeuLL76grKys4+nksrIyRowYwerVq/nOd74DwHPPPUd+fj6tra00Nzczbtw4wOky+6mnnuLBBx/kiSee4NZbb+Xiiy9m/vz5rFixgqOOOoq7774bn8/HjTfeyDHHHMO0adN44IEHAKcrjtmzZ/P973+/W5cd4JxoP/XUUyxcuJCXX36547WdW7Zs4eCDD2bu3LlMmjSJ888/n6Ym5y2UPXXv7bdp0yYmT95Xg79hwwamTJkS470aXG83pAe5f4P1lhWyPsrtubVNVetEJB84GafFUyVOx31LgLnAcxFFHAPVtU2UF+eRk2XPOBgTtaXz4csPw5493+eFzF4OOfsfAaff0ePkU045hVtvvZUDDzyQk08+me9973uceOKJTJ48mXfffReAFStWcPjhh/P222/j9Xo57rjjOpVx5ZVXsnLlSs466yzOP/98qqqquOuuuzq61V6wYAElJSW8/fbb7Nq1i9NOO41TTjkFgNWrV7N27VrGjh3bLbY33niDsWPHMn78eGbNmsVLL73UkbA+/fRTHnroIaZPn87ll1/Offfdx09/+lOg5+69AcaPH09JSQnvvfceRx11FI888gjz5s0LvQ9jJOTRUVUfcAdfVdVbAj/A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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "bench.xlabel = \"n_rows\"\n",
    "bench.plot(logx=False, logy=False)\n",
    "plt.title(\"Modin DataFrame Performance Benchmark\")\n",
    "plt.savefig(\"modin_swifter_performance_benchmark.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-08-03T18:44:50.611292Z",
     "start_time": "2020-08-03T18:44:49.763201Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "bench.xlabel = \"log10(n_rows)\"\n",
    "bench.plot(logx=True, logy=True)\n",
    "plt.title(\"Modin DataFrame Performance Benchmark\")\n",
    "plt.ylabel(\"Runtime [log10(s)]\")\n",
    "plt.savefig(\"modin_swifter_performance_benchmark_loglog.png\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
